package com.tbit.main.service;

import com.tbit.main.h2.pojo.ParkPoint;
import com.tbit.main.pojo.HeatMapStat;
import com.tbit.main.pojo.ParkPointMachineCount;
import com.tbit.main.pojo.Point;

import java.util.List;
import java.util.Map;

/**
 * 停车点
 *
 * @author Leon
 * 2019年11月9日 下午2:33:51
 */
public interface ParkPointService {
    /**
     * 添加
     *
     * @param parkPoint
     */
    void insert(ParkPoint parkPoint);

    /**
     * 添加
     *
     * @param parkPoints
     */
    void insertBatch(List<ParkPoint> parkPoints);

    /**
     * 更新
     *
     * @param parkPoint
     */
    void update(ParkPoint parkPoint);

    /**
     * 批量更新
     *
     * @param map
     */
    void updateBatch(List<Map<String, Object>> map);

    /**
     * 删除
     *
     * @param parkPointId
     */
    void del(Integer parkPointId);

    /**
     * 根据停车点id查询
     *
     * @param parkPointId
     * @return
     */
    ParkPoint getByParkPointId(Integer parkPointId);

    /**
     * 根据设备id查询
     *
     * @param machineId
     * @return
     */
    ParkPoint getByMachineId(Integer machineId);

    /**
     * 根据平台账户id查询
     *
     * @param accountId
     * @return
     */
    List<ParkPoint> getByAccountId(Integer accountId);

    /**
     * 根据分区id查询
     *
     * @param regionId
     * @return
     */
    List<ParkPoint> getByRegionId(List<Integer> regionId);

    /**
     * 根据平台账户id查询
     *
     * @param accountIds
     * @return
     */
    List<ParkPoint> getByAccountIds(List<Integer> accountIds, String updateTime);

    /**
     * 根据分区id和站点等级查询所有
     *
     * @return
     */
    List<ParkPoint> getByRegionIdAndLevel(List<Integer> regionId, Integer level);

    /**
     * 根据区域id和站点等级查询所有
     *
     * @return
     */
    List<ParkPoint> getByAccountIdAndLevel(Integer accountId, Integer level);

    /**
     * 根据平台账户id查询
     *
     * @param accountIds
     * @return
     */
    List<ParkPoint> getAccountIds(List<Integer> accountIds);

    /**
     * 获取附近站点
     *
     * @param accountId
     * @param point
     * @param mapType
     * @return
     */
    List<ParkPoint> getNear(Integer accountId, Point point, Integer mapType, List<Integer> regionId);

    /**
     * 统计个别站点投放车辆数量
     *
     * @param parkPointIds
     * @return
     */
    List<ParkPointMachineCount> groupByParkPoints(List<Integer> parkPointIds);

    /**
     * 统计站点投放车辆数量
     *
     * @param accountId
     * @return
     */
    List<ParkPointMachineCount> groupByParkPoint(Integer accountId);

    /**
     * 统计分区投放车辆数量
     *
     * @param regionId
     * @return
     */
    List<ParkPointMachineCount> groupByRegionId(List<Integer> regionId);

    /**
     * 根据代理商和半径查询
     *
     * @param accountId
     * @param lo
     * @param la
     * @param radius
     * @return
     */
    List<ParkPoint> getByAccountAndArea(Integer accountId, Double lo, Double la, Integer radius);


    /**
     * 根据分区和半径查询
     *
     * @param regionId
     * @param lo
     * @param la
     * @param radius
     * @return
     */
    List<ParkPoint> getByRegionIdAndArea(List<Integer> regionId, Double lo, Double la, Integer radius);

    /**
     * 检查在那个站点
     *
     * @param accountId
     * @param point
     * @param radius
     * @param allowRange
     * @return
     */
    ParkPoint checkInParkPoint(Integer accountId, Point point, Integer radius, Integer allowRange);

    /**
     * 检查在那个站点最近的站点
     *
     * @param accountId
     * @param point
     * @param radius
     * @param allowRange
     * @return
     */
    ParkPoint checkInParkPointNew(Integer accountId, Point point, Integer radius, Integer allowRange);


    /**
     * 站点热力图数据
     *
     * @param accountId
     * @param type
     * @param startTime
     * @param endTime
     * @return
     */
    List<HeatMapStat> statByPark(Integer accountId, Integer type, String startTime, String endTime);

    /**
     * 清除已删除分区站点
     *
     * @return
     */
    List<Integer> getNotRegionId();

    /**
     * 更新过期分区站点
     *
     * @param parkPointIds
     */
    void delRegionId(List<Integer> parkPointIds);

    /**
     * 批量获取站点
     *
     * @param parkPoints
     * @return
     */
    List<ParkPoint> getByParkPoints(List<Integer> parkPoints);

    /**
     * 获取站点
     *
     * @param accountId
     * @param accountUserId
     * @param regionId
     * @return
     */
    List<ParkPoint> getByRegionIds(Integer accountId, Integer accountUserId, List<Integer> regionId);

    /**
     * 查询所有
     *
     * @return
     */
    List<ParkPoint> getAll();

    void test();

    List<ParkPoint> getAccountIdName(Integer accountId, String name);
}